// ==UserScript== // @name Platform Spoofer // @namespace https://viayoo.com/ // @version 0.5 // @description Modify platform Only. // @author Via // @match *://*/* // @exclude *://rebang.today/* // @exclude *://*.github.com/* // @exclude *://scriptcat.org/* // @exclude *://greasyfork.org/* // @exclude *://github.com/* // @exclude *://*.google.*/* // @exclude *://x.com/* // @exclude *://twitter.com/* // @exclude *://*.bing.*/* // @exclude *://*.baidu.*/* // @exclude *://*.yandex.*/* // @exclude *://*.iqiyi.com/* // @exclude *://*.qq.com/* // @exclude *://*.v.qq.com/* // @exclude *://*.sohu.com/* // @exclude *://*.mgtv.com/* // @exclude *://*.ifeng.com/* // @exclude *://*.pptv.com/* // @exclude *://*.sina.com.cn/* // @license MIT // @grant none // @run-at document-start // ==/UserScript== (function() { 'use strict'; const FAKE_PLATFORM = 'Mac'; const spoofNavigator = new Proxy(navigator, { get(target, prop) { return prop === 'platform' ? FAKE_PLATFORM : Reflect.get(target, prop); }, getOwnPropertyDescriptor(target, prop) { if (prop === 'platform') { return { value: FAKE_PLATFORM, writable: false, configurable: true, enumerable: true }; } return Object.getOwnPropertyDescriptor(target, prop); } }); try { const descriptor = Object.getOwnPropertyDescriptor(navigator, 'platform'); if (descriptor?.configurable) { Object.defineProperty(navigator, 'platform', { get: () => FAKE_PLATFORM, configurable: true, enumerable: true }); } else if (navigator.__defineGetter__) { navigator.__defineGetter__('platform', () => FAKE_PLATFORM); } Object.defineProperty(window, 'navigator', { value: spoofNavigator, writable: false, configurable: true }); const protoDescriptor = Object.getOwnPropertyDescriptor(Navigator.prototype, 'platform'); if (protoDescriptor?.configurable) { Object.defineProperty(Navigator.prototype, 'platform', { get: () => FAKE_PLATFORM, configurable: true, enumerable: true }); } const originalIndexOf = String.prototype.indexOf; String.prototype.indexOf = function(searchString) { if (this === FAKE_PLATFORM) { if (searchString === 'Win' || searchString === 'Linux' || searchString === 'X11') return -1; if (searchString === 'Mac') return 0; } return originalIndexOf.call(this, searchString); }; } catch (e) { console.warn('Platform spoofing fallback:', e); window.navigator = spoofNavigator; } Object.freeze(window.navigator); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { if (navigator.platform !== FAKE_PLATFORM) { Object.defineProperty(window, 'navigator', { value: spoofNavigator, writable: false, configurable: true }); Object.freeze(window.navigator); } }, { once: true }); } })();